/* eslint-disable no-undef */
import adapter from 'axios-adapter-uniapp'
import axios from 'axios'
import store from '@/store'
import { apiPrefix } from '@/config'

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'

const baseURL = `${apiPrefix}`
const timeout = 20000

const service = axios.create({
  baseURL,
  timeout,
  adapter,
})

// 请求拦截
service.interceptors.request.use(request => {
  const username = store.state.user.userInfo.username
  if (username) request.headers.username = encodeURIComponent(username)
  return request
})


// 响应拦截
service.interceptors.response.use(async res => {
  // 配置了clearCode，清空store里面的code，获取最新的
  if (res.config && res.config.clearCode) {
    store.commit('user/setCode', '')
    store.dispatch('user/uniLogin')
  }
  console.log('res', res)
  if (res.status === 200 && res.data) {
    // 有些接口处理逻辑中可能需要根据code进行判断，这里根据raw字段返回全部的数据
    if (res.config && res.config.raw) return Promise.resolve(res.data)
    const code = +res.data.code
    if (code === 200) {
      // 默认返回的是data字段
      return Promise.resolve(res.data)
    } else if (code === 401) {
      // 未登录，清除用户信息
      clearUserInfo()
      uni.showToast({
        title: '请先登录',
        icon: 'none',
      })
      return Promise.reject(new Error('unlogin'))
    } else if (
      // code重复使用或者过期，需要重新获取code
      code === 40029 ||
      code === 40163 ||
      (res.data.errMsg || res.data.msg).includes('40029') ||
      (res.data.errMsg || res.data.msg).includes('40163')
    ) {
      clearUserInfo()
      uni.showToast({
        title: '登录过期，请重新登录',
        icon: 'none',
      })
      store.dispatch('user/uniLogin')
      return Promise.reject(new Error('unlogin'))
    } else {
      // 错误提示
      if (res.data.msg || res.data.errMsg) {
        // 错误统一处理
        uni.showToast({
          title: res.data.msg || res.data.errMsg,
          icon: 'none',
        })
      }
      return Promise.reject(res.data.msg || res.data.errMsg)
    }
  } else {
    return Promise.reject(res)
  }
})

// 清除用户信息
const clearUserInfo = () => {
  store.commit('user/setUserInfo', {})
  store.commit('user/setCode', '')
}

export default service
